package com.wk.paradise.redis.utils;

import com.wk.paradise.redis.config.redisConfig.RedisPool;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;

/**
 * @Classname PipelineUtil
 * @Description TODO
 * @Date 2019/12/23 11:27
 * @Author by weikai
 */
public final class PipelineUtil {

  Logger logger = LoggerFactory.getLogger(PipelineUtil.class);

  private PipelineUtil() {
  }

  /**
   * 说明如下：
   * ·利用jedis对象生成一个pipeline对象， 直接可以调用
   * jedis.pipelined（） 。
   * ·将del命令封装到pipeline中， 可以调用pipeline.del（String key） ， 这个
   * 方法和jedis.del（String key） 的写法是完全一致的， 只不过此时不会真正的
   * 执行命令。
   * ·使用pipeline.sync（） 完成此次pipeline对象的调用。
   * @param pool
   * @param keys
   */
  public static void mdel(RedisPool pool, List<String> keys) {

    Jedis jedis = pool.getResource();

    // 1)生成pipeline对象
    Pipeline pipeline = jedis.pipelined();
    // 2)pipeline执行命令， 注意此时命令并未真正执行
    for (String key : keys) {
      pipeline.del(key);
    }
    // 3)执行命令
    pipeline.sync();
  }

  /**
   * 使用pipeline.syncAndReturnAll（） 将
   * pipeline的命令进行返回， 例如下面代码将set和incr做了一次pipeline操作
   * @param pool
   * @return
   */
  public static List<Object> resultList(RedisPool pool){

    Jedis jedis = pool.getResource();
    Pipeline pipeline = jedis.pipelined();
    pipeline.set("hello", "world");
    pipeline.incr("counter");
    List<Object> resultList = pipeline.syncAndReturnAll();
    return resultList;
  }

}
